#include "i2c.h"
#include "systick.h"

void i2c_gpio_SCL_w(uint8_t value)
{
    gpio_bit_write(GPIOB, GPIO_PIN_6, (bit_status)value);
    delay_1us(10);
}
void i2c_gpio_SDA_w(uint8_t value)
{
    gpio_bit_write(GPIOB, GPIO_PIN_7, (bit_status)value);
    delay_1us(10);
}
uint8_t i2c_gpio_SDA_r(void)
{
    uint8_t ret;
    ret = gpio_input_bit_get(GPIOB, GPIO_PIN_7);
    return ret;
}

void i2c_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);

    gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);

    gpio_bit_set(GPIOB, GPIO_PIN_6 | GPIO_PIN_7);
}

void i2c_gpio_start(void)
{
    i2c_gpio_SDA_w(1);
    i2c_gpio_SCL_w(1);
    i2c_gpio_SDA_w(0);
    i2c_gpio_SCL_w(0);
}
void i2c_gpio_stop(void)
{
    i2c_gpio_SDA_w(0);
    i2c_gpio_SCL_w(1);
    i2c_gpio_SDA_w(1);
}

void i2c_gpio_send_byte(uint8_t byte)
{
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        i2c_gpio_SDA_w(byte & (0x80 >> i));
        i2c_gpio_SCL_w(1);
        i2c_gpio_SCL_w(0);
    }
}
uint8_t i2c_gpio_recv_byte(void)
{
    uint8_t result = 0;
    uint8_t i;
    i2c_gpio_SDA_w(1);
    for (i = 0; i < 8; i++)
    {
        i2c_gpio_SCL_w(1);
        if (i2c_gpio_SDA_r())
        {
            result |= (0x80 >> i);
        }
        i2c_gpio_SCL_w(0);
    }
    return result;
}

void i2c_gpio_ack(void)
{
    i2c_gpio_SCL_w(0);
    i2c_gpio_SDA_w(0);
    i2c_gpio_SCL_w(1);
    i2c_gpio_SCL_w(0);

    // i2c_gpio_SDA_w(1);
    // i2c_gpio_SCL_w(0);
    // i2c_gpio_SDA_w(0);
    // i2c_gpio_SCL_w(1);
    // i2c_gpio_SCL_w(0);
}
void i2c_gpio_noack(void)
{
    i2c_gpio_SCL_w(0);
    i2c_gpio_SDA_w(1);
    i2c_gpio_SCL_w(1);
    i2c_gpio_SCL_w(0);

    // i2c_gpio_SDA_w(0);
    // i2c_gpio_SCL_w(0);
    // i2c_gpio_SDA_w(1);
    // i2c_gpio_SCL_w(1);
    // i2c_gpio_SCL_w(0);
}
uint8_t i2c_gpio_recv_ack(void)
{
    uint8_t ret_ack;
    i2c_gpio_SDA_w(1);
    i2c_gpio_SCL_w(1);
    ret_ack = i2c_gpio_SDA_r();
    i2c_gpio_SCL_w(0);
    return ret_ack;
}
